<?php
namespace core\models;
/**
 * ZF错误异常
 * 使用方法：throw \Z::Error('错误信息');
 * @package core\models
 * @author  ZhouHaoHua <53027327@qq.com>
 * @package
 */
class Error extends \ErrorException {
    /**
     * 取得html格式的报错消息
     * @author ZhouHaoHua <53027327@qq.com>
     * @param bool $user_entitiles 是否转成实体化字码
     * @param string $out_type 输出方式，string为字符串格式，array为数组格式
     * @return string|array
     */
    public function getMessageHtml($user_entitiles = false, $out_type = 'string') {
        $error = array();
        if(!$user_entitiles){
            $error[] = str_pad($error[sizeof($error)-1], 100,'=').PHP_EOL;
        }
        $error[]= '<pre>';
        $error[]= '错误简述：' . PHP_EOL;
        $error[]= $this->getMessage() . PHP_EOL;
        $error[]= '<hr />';
        $trace = $this->getTrace();
        krsort($trace);
        $trace        = array_merge($trace);
        $trace_sizeof = sizeof($trace);
        $error[]= '错误追溯（从0步开始，卡在第' . ($trace_sizeof - 1) . '步）：' . PHP_EOL;
        //print_r($trace);
        foreach ($trace as $k => $v) {
            if (($trace_sizeof - 1) == $k) {
                $error[]= '<span style="color: #FF0000;">';
            }
            $error[]= '第' . $k . '步：';
            $error[]= "\t文件：{$v['file']}" . PHP_EOL;
            $error[]= "\t行号：<b>{$v['line']}</b>" . PHP_EOL;
            $error[]= "\t类名：{$v['class']}" . PHP_EOL;
            $error[]= "\t方法：{$v['function']}" . PHP_EOL;
            $error[]= "\t类型：" . ($v['type'] == '::' ? '静态 ::' : ($v['type'] == '->' ? '动态 ->' : $v['type'])) . PHP_EOL;
            $error[]= "\t参数：" . ($v['args'] ? print_r($v['args'], true) : '无') . PHP_EOL;
            if (($trace_sizeof - 1) > $k) {
                $error[]= "<hr />";
            } else {
                $error[]= "</span>";
            }
        }
        $error[]= '报错日期：' . date('Y-m-d H:i:s');
        $error[]= '</pre>';
        if($out_type == 'array'){
            return $error;
        }
        $errorString = implode('',$error);
        if ($user_entitiles === true) $errorString = \Z::Strings()->stringToHtmlEntitiles($errorString, Z_CHARSET_PROJECT);
        return $errorString;
    }
    /**
     * 将错误消息输出到文件
     * @param string $logFile 输出到的目标文件，若文件不存在会尝试自动添加
     * @return int|false 返回写入到文件内数据的字节数，失败时返回FALSE
     * @author ZhouHaoHua <53027327@qq.com>
     */
    public function outputToFile($logFile){
        return file_put_contents($logFile, strip_tags($this->getMessageHtml(false)) . PHP_EOL . PHP_EOL, FILE_APPEND);
    }
}